/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ssga.DAO;

import ssga.pojos.EntidadAlumno;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import ssga.dataIO.DataIO;
import ssga.utils.StoredProcedure;

/**
 *
 * @author David
 * 
 * Clase que se encarga de realizar las altas - consultas - Modificaciones 
 * y eliminaciones de la tabla de alumnos
 */
public class ABMAlumnosDAO {

    /**
     * clase que devuelve la lista de alumos de una materia determinada
     */
    private StoredProcedure p = new StoredProcedure("P_ABM_TBL_ALUMNO", 24, 2, false);
    private StoredProcedure ps = new StoredProcedure("SP_TBL_ALUMNO", 0, 23, false);

    /**
     * Metodo que se encarga de cargar los datos para ejecutar
     * el procedimiento
     * 
     * @return boolean
     */
    private boolean doAbm(String op, String funcion, EntidadAlumno ea) {
        boolean bret = false;
        CallableStatement cs = null;
        try {
            cs = DataIO.prepareExePro(p);
            if (cs != null) {

                // parametros de entrada
                cs.setString(1, op);
                cs.setInt(2, ea.getLegajo());
                cs.setString(3, ea.getApenom());
                cs.setString(4, ea.getTdoc());
                cs.setInt(5, ea.getNdoc());

                DataIO.setParamValue(cs, 6, Types.VARCHAR, ea.getCp());
                DataIO.setParamValue(cs, 7, Types.VARCHAR, ea.getLocalidad());
                DataIO.setParamValue(cs, 8, Types.VARCHAR, ea.getDir());
                DataIO.setParamValue(cs, 9, Types.VARCHAR, ea.getTel());
                DataIO.setParamValue(cs, 10, Types.VARCHAR, ea.getCel());
                DataIO.setParamValue(cs, 11, Types.VARCHAR, ea.getEmail());
                DataIO.setParamValue(cs, 12, Types.VARCHAR, ea.getEscuela());
                DataIO.setParamValue(cs, 13, Types.VARCHAR, ea.getTitulo());
                DataIO.setParamValue(cs, 14, Types.VARCHAR, ea.getOrientacion());
                cs.setString(15, ea.getNacionalidad());

                //FECHA NAC
                DataIO.setParamValueDate(cs, 16, ea.getFechaNac());
                DataIO.setParamValue(cs, 17, Types.VARCHAR, ea.getLugarNac());
                cs.setString(18, ea.getDebeTitulo());

                //Fecha Inscripcion
                DataIO.setParamValueDate(cs, 19, ea.getFechaNac());
                DataIO.setParamValue(cs, 20, Types.INTEGER, ea.getNroInscr());

                cs.setString(21, ea.getSexo());
                //Fecha baja
                DataIO.setParamValueDate(cs, 22, ea.getFechaBaja());
                cs.setInt(23, ea.getIdPlan());
                DataIO.setParamValue(cs, 24, Types.INTEGER, ea.getIdPlano());
                // parametros de salida
                cs.registerOutParameter(25, Types.INTEGER);
                cs.registerOutParameter(26, Types.VARCHAR);

                // ejecuto query
                DataIO.executePro(p, cs);

                //Imprime el resultado en la Consola
                System.out.print(funcion + ": ret=" + cs.getInt(25) + " dret=" + cs.getString(26)+"\b");
                if (cs.getInt(25) != 0) {
                    bret = true;
                }
            }
        } catch (SQLException sqle) {
            DataIO.doException(sqle, funcion + ": No pude ejecutar procedimiento " + p);
        }
        return bret;
    }

    /**
     * Metodo de Interfase EntidadSp, ver EntidadSp para mas info
     */
    public ResultSet getResultSetPro() {
        ResultSet rs = null;
        CallableStatement cs = null;
        try {
            cs = DataIO.prepareSelPro(ps);
            if (cs != null) {
                // parametros de entrada
                // parametros de salida
                cs.registerOutParameter(1, Types.INTEGER);
                cs.registerOutParameter(2, Types.VARCHAR);
                cs.registerOutParameter(3, Types.VARCHAR);
                cs.registerOutParameter(4, Types.INTEGER);
                cs.registerOutParameter(5, Types.INTEGER);
                cs.registerOutParameter(6, Types.VARCHAR);
                cs.registerOutParameter(7, Types.VARCHAR);
                cs.registerOutParameter(8, Types.VARCHAR);
                cs.registerOutParameter(9, Types.VARCHAR);
                cs.registerOutParameter(10, Types.VARCHAR);
                cs.registerOutParameter(11, Types.VARCHAR);
                cs.registerOutParameter(12, Types.VARCHAR);
                cs.registerOutParameter(13, Types.VARCHAR);
                cs.registerOutParameter(14, Types.VARCHAR);
                cs.registerOutParameter(15, Types.VARCHAR);
                cs.registerOutParameter(16, Types.VARCHAR);
                cs.registerOutParameter(17, Types.VARCHAR);
                cs.registerOutParameter(18, Types.VARCHAR);
                cs.registerOutParameter(19, Types.INTEGER);
                cs.registerOutParameter(20, Types.VARCHAR);
                cs.registerOutParameter(21, Types.VARCHAR);
                cs.registerOutParameter(22, Types.INTEGER);
                cs.registerOutParameter(23, Types.INTEGER);

                // ejecuto query
                rs = DataIO.executePro(ps, cs);
                //
            }
        } catch (SQLException sqle) {
            DataIO.doException(sqle, "getResultSetPro(): No puedo ejecutar procedimiento " + ps);
        }
        return rs;
    }

    /**
     * Construsctor a partir del resulset de una consulta
     * @return EntidadAlumno
     */
    public List<EntidadAlumno> getEntidadAlumno(ResultSet rs) throws SQLException {
        // valores para un nuevo objeto Entidad Alumno
        List<EntidadAlumno> lea = new ArrayList<EntidadAlumno>();
        try {

            //Recooro el resulset y genero la lista de alumnos
            while (rs.next()) {
                
                EntidadAlumno ea = new EntidadAlumno();

                ea.setLegajoa(rs.getInt("legajoa"));
                ea.setApenom(rs.getString("apenom"));
                ea.setTdoc(rs.getString("tdoc"));
                ea.setNdoc(rs.getInt("nrodoc"));
                ea.setCp(rs.getInt("cp"));
                ea.setLocalidad(rs.getString("localidad"));
                ea.setDir(rs.getString("dir"));
                ea.setTel(rs.getString("te"));
                ea.setCel(rs.getString("cel"));
                ea.setEmail(rs.getString("email"));
                ea.setEscuela(rs.getString("escuela"));
                ea.setTitulo(rs.getString("titulo"));
                ea.setOrientacion(rs.getString("orientacion"));
                ea.setNacionalidad(rs.getString("nacionalidad"));

                if (rs.getDate("fecha_nac") != null) {
                    SimpleDateFormat fmt = new SimpleDateFormat(DataIO.getDateFmt());
                    ea.setFechaNac(fmt.format(rs.getDate("fecha_nac")));
                } else {
                    ea.setFechaNac("");
                }

                ea.setLugarNac(rs.getString("lugar_nac"));
                ea.setDebeTitulo(rs.getString("debe_titulo"));

                if (rs.getDate("fecha_inscr") != null) {
                    SimpleDateFormat fmt = new SimpleDateFormat(DataIO.getDateFmt());
                    ea.setFechaInscr(fmt.format(rs.getDate("fecha_inscr")));
                } else {
                    ea.setFechaInscr("");
                }

                ea.setNroInscr(rs.getInt("nro_inscr"));
                ea.setSexo(rs.getString("sexo"));

                if (rs.getDate("fecha_baja") != null) {
                    SimpleDateFormat fmt = new SimpleDateFormat(DataIO.getDateFmt());
                    ea.setFechaBaja(fmt.format(rs.getDate("fecha_baja")));
                } else {
                    ea.setFechaBaja("");
                }

                ea.setIdPlan(rs.getInt("idplan"));
                ea.setIdPlano(rs.getInt("idplano"));

                lea.add(ea);
            }

            return lea;

        } catch (Exception e) {
            return null;
        }
    }

    /**
     * Metodo de Actualizar Datos del Alumno
     */
    public boolean doUpdate(EntidadAlumno ea) {
        return doAbm("C", "doUpdate()", ea);
    }

    /**
     * Metodo Eliminar Alumno
     */
    public boolean doDelete(EntidadAlumno ea) {
        return doAbm("B", "doDelete()", ea);
    }

    /**
     * Metodo de Agregar Alumno
     */
    public boolean doInsert(EntidadAlumno ea) {
        return doAbm("A", "doInsert()", ea);
    }
}
